/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
 * bocciawii
 * Copyright (C) Grupo de trabajo ULE 2010 <ulewii@googlegroups.com>
 * 
 * teclado is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * teclado is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef _BOTON_H_
#define _BOTON_H_
#define DIR_ARR 1
#define DIR_ABA 2
#define DIR_IZQ 3
#define DIR_DER 4
#include "linked-container.h"

/**
 * @brief LinkedContainer con propiedades útiles para el menú
 *
 * Además de contar con la funcionalidad ofrecida por un <code>LinkedContainer</code>
 * esta clase otorga una funcionalidad propia de un botón, es decir, 
 * tiene una id asociada y guarda las IDs de sus "vecinos" en un super-contenedor.
 */
class Boton:public LinkedContainer
{
public:
	/**
	 * @brief Constructor simple. Asigna ID. Llama al superconstructor
	 * con x e y
	 *
	 * Crea el Botón con el ID asignado (se aconseja que sea único en todo el 
     * super-contenedor, ya que es el utilizado para que sus vecinos
	 * accedan a él, y es el que se devuelve cuando se ha pulsado encima)
	 *
	 */
	Boton(std::string id, int x, int y);
	~Boton();

	/**
	 * @brief Devuelve a uno de sus vecinos
	 *
	 * Devolverá el identificador de uno de sus vecinos, dependiendo
	 * de la dirección pedida.
	 *
	 * @param dir Dirección de la que se quiere averiguar el vecino
	 * @return id con el vecino (si no hay ninguno en ella, el vecino será él mismo)
	 */
	std::string OnDir(int dir);

	
	/**
	 * @brief Asignar vecino en una dirección
	 *
	 * Asignará un ID de un vecino en una dirección determinada
	 *
	 * @param dir Dirección en la que se quiere asignar un vecino.
	 * @param id ID del vecino que se asigna
	 */
	void ToDir(int dir, std::string id);
	
	/**
	 * @brief Setter para selecccionabilidad del container
	 *
	 * Asignará si el container es seleccionable o no
	 *
	 * @param selectable 1 para que se pueda seleccionar, 0 para no
	 */
	inline void SetSelectable(int selectable)
	{   _selectable = selectable;   }

	/**
	 * @brief Getter para la seleccionabilidad del container
	 *
	 * Devolverá 1 para container seleccionable, 0 para no
	 *
	 * @return int con 1 seleccionable, 0 no.
	 */
	inline int IsSelectable()
	{	return _selectable;   }

	/**
	 * @brief Getter del ID
	 *
	 * Obtener el ID del container
	 * @return string con el ID del container
	 */
	std::string GetID();

protected:

private:
	std::string _id;

	int _selectable;
	
	std::string _right;
	std::string _left;
	std::string _up;
	std::string _down;

};

#endif // _BOTON_H_
